"""
考试通知系统（某一个学期）
1.	没有用户，没有用户权限
2.	列表+字典
3.	功能
3.1	添加考试信息
3.1.1	字段：学生姓名、班级、学号、考试科目、考试时间、考试地点、座位号
3.1.2	判断
3.1.2.1	同一个学生不能出现两门或者两门以上相同课程的考试
3.1.2.2	同一个学生不能在同一时间考两门或者两门以上的课程
3.1.2.3	同一个时间同一个考试地点不能排两门或者两门以上的课程考试
3.1.3	考试时间：使用系统时间，datetime，
3.1.4	座位号：随机

3.2 查询
3.2.1 按照学生的学号查询——所有的该同学的考试信息
3.2.2 控制台用表格，或者形成文件（open，read，write，close）

3.3 修改
3.4 删除
"""

import time
import random

# 删除考试信息
def deleteExam():
    sid = input("请输入要删除的学号关联的考试信息：")
    for exam in exam_list:
        if sid == exam["sid"]:
            exam_list.remove(exam)
            print("删除成功！")
            return
    print("找不到该学号的考试信息")

# 修改考试信息
def updateBySid():
    sid = input("请输入要修改的学号：")
    for exam in exam_list:
        if sid == exam["sid"]:
            # 修改地点
            exam["address"] = input("请输入新的地点")
            # 修改时间
            # 获取当前系统时间
            localTime = time.localtime(time.time())
            localTimeStr = time.strftime("%Y-%m-%d", time.localtime())
            print("当前系统时间为：" + localTimeStr + ",您只能添加在此之后的考试时间")
            while True:
                # 用户输入年份
                inputYear = input("请输入新的考试年份：")
                if not inputYear.isdigit():
                    print("--> 只能输入纯数字！<--")
                    continue
                if int(inputYear) < localTime.tm_year:
                    print("--> 不能回到过去 <--")
                    continue
                # 用户输入月份
                inputMonth = input("请输入新的考试月份：")
                if not inputMonth.isdigit():
                    print("--> 只能输入纯数字！<--")
                    continue
                # 注意此时要求在年份相同的情况下比较月份
                if int(inputMonth) < localTime.tm_mon and int(inputYear) == localTime.tm_year:
                    print("--> 不能回到过去 <--")
                    continue
                if int(inputMonth) > 12:
                    print("--> 一年只有12个月哦 <--")
                    continue
                # 用户输入当前号数
                inputDay = input("请输入新的考试天数：")
                if not inputDay.isdigit():
                    print("--> 只能输入纯数字！<--")
                    continue
                if int(inputDay) < localTime.tm_mday:
                    print("--> 不能回到过去 <--")
                    continue
                if int(inputDay) == localTime.tm_mday:
                    print("--> 不能在今天考哦 <--")
                    continue
                if int(inputDay) > 31:
                    print("--> 1个月不可能有超过31天哦 <--")
                    continue
                break
            # 拼接日期
            day = "{}-{}-{}".format(inputYear, inputMonth, inputDay)
            print("要修改的考试日期为：" + day)
            exam["day"] = day
            print("修改成功！")
            return
    print("找不到该学生的考试信息！")
# 查询学生考试信息

def selectBySid():
    sid = input("请输入要查询的学号：")
    for exam in exam_list:
        if sid == exam["sid"]:
            print("┌───────────┬───────┬───────┬───────┬───────────┬───────┬───────────┐")
            print("│\t学号\t\t│姓名\t│班级\t│科目\t│地点\t\t│座位\t│考试时间\t\t│")
            print("├───────────┼───────┼───────┼───────┼───────────┼───────┼───────────┤")
            print("| " + exam["sid"] + "\t|" + exam["name"] + "\t|" + exam["classes"] + "\t|"
                  + exam["subject"] + "\t|" + exam["address"] + "\t|" + exam["seat"] + "\t\t|" + exam["day"] + "\t|")
            print("└───────────┴───────┴───────┴───────┴───────────┴───────┴───────────┘")
            return
    print("找不到该学生的考试信息！")

# 查询所有考试信息
def selectAll():
    print("当前所有考试信息如下:")
    print("┌───────────┬───────┬───────┬───────┬───────────┬───────┬───────────┐")
    print("│\t学号\t\t│姓名\t│班级\t│科目\t│地点\t\t│座位\t│考试时间\t\t│")
    print("├───────────┼───────┼───────┼───────┼───────────┼───────┼───────────┤")
    nowLineNum = 1
    for exam in exam_list:
        print("| " + exam["sid"] + "\t|" + exam["name"] + "\t|" + exam["classes"] + "\t|"
              + exam["subject"] + "\t|" + exam["address"] + "\t|" + exam["seat"] + "\t\t|" + exam["day"] + "\t|")
        if nowLineNum == len(exam_list):
            print("└───────────┴───────┴───────┴───────┴───────────┴───────┴───────────┘")
            break
        print("├───────────┼───────┼───────┼───────┼───────────┼───────┼───────────┤")
        nowLineNum += 1
    return

# 添加考试信息
def addExam():
    print("|\t\t\t添加考试信息功能\t\t\t|")
    sid = input("请输入学号：")
    # 已被占用座位列表 用来排除重复的情况
    seatList = []
    name = ""
    classes = ""
    # 默认学号不存在
    sidExistent = False
    # 判断学号是否存在
    for exam in exam_list:
        # 将当前考试信息记录的座位编号添加到已存在的座位列表
        seatList.append(exam["seat"])
        if exam["sid"] == sid:
            # 学号存在的情况：直接给学号的姓名、班级等固有信息
            sidExistent = True
            name = exam["name"]
            classes = exam["classes"]
            print("您输入的学号已存在，学号：{},姓名：{},班级：{}".format(sid, name, classes))
    # 学号不存在，需要手动添加
    if not sidExistent:
        name = input("请输入姓名：")
        classes = input("请输入班级：")

    # 获取当前系统时间
    localTime = time.localtime(time.time())
    localTimeStr = time.strftime("%Y-%m-%d", time.localtime())
    print("当前系统时间为：" + localTimeStr + ",您只能添加在此之后的考试时间")
    while True:
        # 用户输入年份
        inputYear = input("请输入考试年份：")
        if not inputYear.isdigit():
            print("--> 只能输入纯数字！<--")
            continue
        if int(inputYear) < localTime.tm_year:
            print("--> 不能回到过去 <--")
            continue
        # 用户输入月份
        inputMonth = input("请输入考试月份：")
        if not inputMonth.isdigit():
            print("--> 只能输入纯数字！<--")
            continue
        # 注意此时要求在年份相同的情况下比较月份
        if int(inputMonth) < localTime.tm_mon and int(inputYear) == localTime.tm_year:
            print("--> 不能回到过去 <--")
            continue
        if int(inputMonth) > 12:
            print("--> 一年只有12个月哦 <--")
            continue
        # 用户输入当前号数
        inputDay = input("请输入考试天数：")
        if not inputDay.isdigit():
            print("--> 只能输入纯数字！<--")
            continue
        if int(inputDay) < localTime.tm_mday:
            print("--> 不能回到过去 <--")
            continue
        if int(inputDay) == localTime.tm_mday:
            print("--> 不能在今天考哦 <--")
            continue
        if int(inputDay) > 31:
            print("--> 1个月不可能有超过31天哦 <--")
            continue
        break
    # 拼接日期
    day = "{}-{}-{}".format(inputYear, inputMonth, inputDay)
    print("您输入的考试日期为：" + day)

    # 用户输入科目和地点，不能为空
    while True:
        subject = input("请输入考试科目：")
        address = input("请输入考试地点：")
        if subject == "" or address == "":
            print("请不要输入空串")
            continue
        break

    # 随机生成座位 可能会重复
    seat = random.randint(1, 80)
    # 遍历当前已存在列表 拒绝重复
    seat = random.randint(1, 5)
    while True:
        # 座位已满的情况，直接退出方法
        if len(seatList) == 80:
            print("座位已满，请不要添加啦")
            return
        if seat in seatList:
            seat = random.randint(1, 80)
            continue
        break
    seat = str(seat)
    # 封装学生信息，并添加到学生列表
    addExamInfo = {"sid": sid, "name": name, "classes": classes, "subject": subject,
                   "address": address, "seat": seat, "day": day}
    exam_list.append(addExamInfo)
    print(addExamInfo)


# 打印欢迎以及提示词
def printInfo():
    print(" " + "—" * 39)
    print("|\t\t\t欢迎使用考试通知系统\t\t\t|")
    print("|【1】 添加考试信息\t\t\t\t\t\t|")
    print("|【2】 查询全部考试信息\t\t\t\t\t\t|")
    print("|【3】 查询学生考试信息\t\t\t\t\t\t|")
    print("|【4】 修改考试信息\t\t\t\t\t\t|")
    print("|【5】 删除考试信息\t\t\t\t\t\t|")
    print("|【0】 退出系统\t\t\t\t\t\t\t|")
    print(" " + "—" * 39)


# 入口函数
def examMain():
    while True:
        printInfo()
        action = input("【请输入数字选择操作】：")
        li = ("1", "2", "3", "4", "5", "0")
        if action not in li:
            print("输入数据只能是(1、2、3、4、5、0),请重新输入")
            continue
        print("您选择的操作是{0}".format(action))
        print("—" * 40)
        if action == "1":
            addExam()
        if action == "2":
            selectAll()
        if action == "3":
            selectBySid()
        if action == "4":
            updateBySid()
        if action == "5":
            deleteExam()
        if action == "0":
            print("您已退出系统,欢迎下次使用!")
            return


exam_list = [
    {"sid": "20181001", "name": "小明", "classes": "1808", "subject": "Java", "address": "一号教学楼", "seat": "14",
     "day": "2020-01-02"},
    {"sid": "20181002", "name": "小红", "classes": "1808", "subject": "python", "address": "二号教学楼", "seat": "15",
     "day": "2020-01-03"},
    {"sid": "20181003", "name": "小亮", "classes": "1809", "subject": "html", "address": "三号教学楼", "seat": "16",
     "day": "2020-01-03"}]
examMain()